unit UnitMauMauGUI;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  UnitClientKommunikation, UnitSpieler, UnitColor,
  StdCtrls, ExtCtrls, jpeg, Buttons;

type
  TFormMauMauClient = class(TForm)
    ButtonConnect: TButton;
    EditIP: TEdit;
    EditPort: TEdit;
    EditUsername: TEdit;
    LabelIP: TLabel;
    LabelPort: TLabel;
    Image1: TImage;
    Image5: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    ImageStapel: TImage;
    ButtonRight: TButton;
    ButtonLeft: TButton;
    ButtonChose1: TButton;
    ButtonChose2: TButton;
    ButtonChose3: TButton;
    ButtonChose4: TButton;
    ButtonChose5: TButton;
    TimerWaitForAnswer: TTimer;
    LabelUsername: TLabel;
    ButtonStart: TButton;
    ListBoxPlayer: TListBox;
    LabelPlayer: TLabel;
    lblColor: TLabel;
    btnRedButton: TButton;
    procedure ButtonConnectClick(Sender: TObject);
    procedure TimerWaitForAnswerTimer(Sender: TObject);
    procedure ButtonStartClick(Sender: TObject);
    procedure SyncDeck;
    procedure ButtonRightClick(Sender: TObject);
    procedure ButtonLeftClick(Sender: TObject);
    procedure ButtonChose1Click(Sender: TObject);
    procedure ButtonChose2Click(Sender: TObject);
    procedure ButtonChose3Click(Sender: TObject);
    procedure ButtonChose4Click(Sender: TObject);
    procedure ButtonChose5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormMauMauClient: TFormMauMauClient;
  ClientKommunikation: TClientKommunikation;
  ColorForm: TFormColor;
  Spieler: TSpieler;
  DeckIndex: integer;
  IsConnected: Boolean; //Boolean for Connection


implementation

{$R *.DFM}

//Connect and Disconnect to Server
procedure TFormMauMauClient.ButtonConnectClick(Sender: TObject);
begin
     //Connect to Server and Enable GUI
     if not(IsConnected) then
     begin
          ClientKommunikation := TClientKommunikation.create(EditIP.text,StrToIntDef(EditPort.text,0));
          EditIP.enabled := false;
          EditPort.enabled := false;
          EditUsername.enabled := false;
          Spieler := TSpieler.create(EditUsername.text);
          DeckIndex := 0;
          TimerWaitForAnswer.enabled := true;
          ButtonConnect.Caption := 'Trennen';
          ButtonStart.Enabled := true;
          ButtonRight.Enabled := true;
          ButtonLeft.Enabled := true;
          IsConnected := true;
     end else
     //Disconnect and Disable GUI
     begin
          ClientKommunikation.destroy;
          EditIP.enabled := true;
          EditPort.enabled := true;
          EditUsername.enabled := true;
          Spieler.Destroy;
          DeckIndex := 0;
          TimerWaitForAnswer.enabled := false;
          ButtonConnect.Caption := 'Verbinden';
          ButtonStart.Enabled := false;
          ButtonRight.Enabled := false;
          ButtonLeft.Enabled := false;
          ButtonChose1.Enabled := false;
          ButtonChose2.Enabled := false;
          ButtonChose3.Enabled := false;
          ButtonChose4.Enabled := false;
          ButtonChose5.Enabled := false;
          IsConnected := false;
     end;
end;

//Timer for Answers to Server from GUI
procedure TFormMauMauClient.TimerWaitForAnswerTimer(Sender: TObject);
var
        i,posleer,wert,farbe: integer;
        Karte: TKarte;
begin
      case ClientKommunikation.getStatus of
           //Send Username and authentificate
           login:
           begin
                ClientKommunikation.send('USER '+EditUsername.text);
                ClientKommunikation.setStatus(loginWait);
           end;
           //Update Onlinelist (ListBoxPlayer)
           WaitForStart:
           begin
                ListBoxPlayer.Items.Clear;
                for i := 0 to ClientKommunikation.getPlayerList.count-1 do
                        ListBoxPlayer.Items.add(ClientKommunikation.getPlayerList[i]);
           end;
           //Game Starts!
           GameStart:
           begin
                ButtonStart.enabled := false;
                case ClientKommunikation.getGameStatus of
                        //Update Deck in Player with Informations from ClientKommunikation
                        DeckFertig:
                        begin
                                Spieler.DeckLeeren;
                                DeckIndex := 0;
                                for i := 0 to ClientKommunikation.getDeckList.count-1 do
                                begin
                                        posleer := pos(' ',ClientKommunikation.getDeckList[i]);
                                        wert := StrToInt(copy(ClientKommunikation.getDeckList[i],0,posleer-1));
                                        farbe := StrToInt(copy(ClientKommunikation.getDeckList[i],posleer,length(ClientKommunikation.getDeckList[i])));
                                        Karte := TKarte.create(wert,farbe);
                                        Spieler.KarteHinzufuegen(Karte);
                                end;
                                SyncDeck;
                                ClientKommunikation.setGameStatus(WaitForPlayer);
                        end;
                        //Check who is on the turn
                        Player:
                        begin
                                if ClientKommunikation.getPlayerOnTurn = Spieler.getUsername then
                                begin
                                     ClientKommunikation.setGameStatus(KarteLeg);
          			     ButtonChose1.Enabled := true;
          			     ButtonChose2.Enabled := true;
          			     ButtonChose3.Enabled := true;
          			     ButtonChose4.Enabled := true;
          			     ButtonChose5.Enabled := true;
				end else
                                    ClientKommunikation.setGameStatus(KarteGelegt);
				//Update Player on Turn
                                for i := 0 to ListBoxPlayer.Items.count-1 do
                                        if ListBoxPlayer.Selected[i] then
                                                ListBoxPlayer.Selected[i] := False;
                                for i := 0 to ListBoxPlayer.Items.Count-1 do
                                begin
                                     if ListBoxPlayer.items[i] = ClientKommunikation.getPlayerOnTurn then
                                        ListBoxPlayer.Selected[i] := true;
                                end;
                        end;
                        //Ask for Color!
			ChoseAColor:
                        begin
                                if ClientKommunikation.getPlayerOnTurn = Spieler.getUsername then
                                begin
                                        ColorForm := TFormColor.Create(Self);
                                        ClientKommunikation.setGameStatus(WaitForColor);
                                        while ColorForm.ShowModal <> mrOK do;
                                        ClientKommunikation.send('COLOR ' + IntToStr(ColorForm.getColor));
                                end else
                                        ClientKommunikation.setGameStatus(ColorChosen);
                        end;
                        //Sets the label for ColorAnswer
                        ColorChosen:
                        begin
                                case StrToInt(ClientKommunikation.getNewColor) of
                                        1: lblColor.caption := 'Kreuz';
                                        2: lblColor.caption := 'Pik';
                                        3: lblColor.caption := 'Herz';
                                        4: lblColor.Caption := 'Karo';
                                end;
                                ClientKommunikation.setGameStatus(EndOfRound);
                        end;
                        //SetCard
                        EndOfRound:
                        begin
                                posleer := pos(' ',ClientKommunikation.getKarteLeg);
                                wert := StrToInt(copy(ClientKommunikation.getKarteLeg,0,posleer-1));
                                farbe := StrToInt(copy(ClientKommunikation.getKarteLeg,posleer,length(ClientKommunikation.getKarteLeg)));
                                Karte := TKarte.create(wert,farbe);
                                ImageStapel.Picture.LoadFromFile('Kartenspiel/'+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe)+'.jpg');
                                ClientKommunikation.SetGameStatus(Deck);
                        end;
                        ///TODO 1 (Game End)
                        ///TODO 2 (Errors)
                end;
           end;
      end;
end;

//Start Game!
procedure TFormMauMauClient.ButtonStartClick(Sender: TObject);
begin
        if ClientKommunikation.getStatus = WaitForStart then
                ClientKommunikation.send('START');
end;

//Synchronisate the Deck with the "GUI-Deck"
procedure TFormMauMauClient.SyncDeck;
var
        tempKarte: TKarte;
        i: integer;
begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex-1 do
            Spieler.getDeck.next;
        tempKarte := Spieler.getDeck.getObject as TKarte;
        if tempKarte <> nil then
           Image1.Picture.LoadFromFile('Kartenspiel/'+IntToStr(tempKarte.getWert)+' '+IntToStr(tempKarte.getFarbe)+'.jpg')
        else
           Image1.Picture := nil;
        Spieler.getDeck.next;
        tempKarte := Spieler.getDeck.getObject as TKarte;
        if tempKarte <> nil then
           Image2.Picture.LoadFromFile('Kartenspiel/'+IntToStr(tempKarte.getWert)+' '+IntToStr(tempKarte.getFarbe)+'.jpg')
        else
           Image2.Picture := nil;
        Spieler.getDeck.next;
        tempKarte := Spieler.getDeck.getObject as TKarte;
        if tempKarte <> nil then
           Image3.Picture.LoadFromFile('Kartenspiel/'+IntToStr(tempKarte.getWert)+' '+IntToStr(tempKarte.getFarbe)+'.jpg')
        else
           Image3.Picture := nil;
        Spieler.getDeck.next;
        tempKarte := Spieler.getDeck.getObject as TKarte;
        if tempKarte <> nil then
           Image4.Picture.LoadFromFile('Kartenspiel/'+IntToStr(tempKarte.getWert)+' '+IntToStr(tempKarte.getFarbe)+'.jpg')
        else
           Image4.Picture := nil;
        Spieler.getDeck.next;
        tempKarte := Spieler.getDeck.getObject as TKarte;
        if tempKarte <> nil then
           Image5.Picture.LoadFromFile('Kartenspiel/'+IntToStr(tempKarte.getWert)+' '+IntToStr(tempKarte.getFarbe)+'.jpg')
        else
           Image5.Picture := nil;
        Spieler.getDeck.next;
end;

//Show Card on the right
procedure TFormMauMauClient.ButtonRightClick(Sender: TObject);
var
        tempKarte: TKarte;
        i: integer;
begin
     Spieler.getDeck.toFirst;
     for i := 0 to DeckIndex+4 do
        Spieler.getDeck.next;
     tempKarte := Spieler.getDeck.getObject as TKarte;
     if tempKarte <> nil then
        inc(DeckIndex);
     SyncDeck;
end;

//Show Card on the left
procedure TFormMauMauClient.ButtonLeftClick(Sender: TObject);
var
        tempKarte, startKarte: TKarte;
        i: Integer;
begin
     if DeckIndex >= 0 then
        dec(DeckIndex);
     SyncDeck;
end;

//Chose Card on position 1
procedure TFormMauMauClient.ButtonChose1Click(Sender: TObject);
var
   Karte: TKarte;
   i: integer;
begin
     if ClientKommunikation.getGameStatus = KarteLeg then
     begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex-1 do
            Spieler.getDeck.next;
        Karte := Spieler.getDeck.getObject as TKarte;
        ClientKommunikation.send('LEG '+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe));
	ClientKommunikation.setGameStatus(KarteGelegt);
        ButtonChose1.Enabled := false;
        ButtonChose2.Enabled := false;
        ButtonChose3.Enabled := false;
        ButtonChose4.Enabled := false;
        ButtonChose5.Enabled := false;
     end;
end;

//Chose Card on position 2
procedure TFormMauMauClient.ButtonChose2Click(Sender: TObject);
var
   Karte: TKarte;
   i: integer;
begin
     if ClientKommunikation.getGameStatus = KarteLeg then
     begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex do
            Spieler.getDeck.next;
        Karte := Spieler.getDeck.getObject as TKarte;
        ClientKommunikation.send('LEG '+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe));
        ClientKommunikation.setGameStatus(KarteGelegt);
        ButtonChose1.Enabled := false;
        ButtonChose2.Enabled := false;
        ButtonChose3.Enabled := false;
        ButtonChose4.Enabled := false;
        ButtonChose5.Enabled := false;
     end;
end;

//Chose Card on position 3
procedure TFormMauMauClient.ButtonChose3Click(Sender: TObject);
var
   Karte: TKarte;
   i: integer;
begin
     if ClientKommunikation.getGameStatus = KarteLeg then
     begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex+1 do
            Spieler.getDeck.next;
        Karte := Spieler.getDeck.getObject as TKarte;
        ClientKommunikation.send('LEG '+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe));
	ClientKommunikation.setGameStatus(KarteGelegt);
        ButtonChose1.Enabled := false;
        ButtonChose2.Enabled := false;
        ButtonChose3.Enabled := false;
        ButtonChose4.Enabled := false;
        ButtonChose5.Enabled := false;
     end;
end;

//Chose Card on position 4
procedure TFormMauMauClient.ButtonChose4Click(Sender: TObject);
var
   Karte: TKarte;
   i: integer;
begin
     if ClientKommunikation.getGameStatus = KarteLeg then
     begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex+2 do
            Spieler.getDeck.next;
        Karte := Spieler.getDeck.getObject as TKarte;
        ClientKommunikation.send('LEG '+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe));
	ClientKommunikation.setGameStatus(KarteGelegt);
        ButtonChose1.Enabled := false;
        ButtonChose2.Enabled := false;
        ButtonChose3.Enabled := false;
        ButtonChose4.Enabled := false;
        ButtonChose5.Enabled := false;
     end;
end;

//Chose Card on position 5
procedure TFormMauMauClient.ButtonChose5Click(Sender: TObject);
var
   Karte: TKarte;
   i: integer;
begin
     if ClientKommunikation.getGameStatus = KarteLeg then
     begin
        Spieler.getDeck.toFirst;
        for i := 0 to DeckIndex+3 do
            Spieler.getDeck.next;
        Karte := Spieler.getDeck.getObject as TKarte;
        ClientKommunikation.send('LEG '+IntToStr(Karte.getWert)+' '+IntToStr(Karte.getFarbe));
	ClientKommunikation.setGameStatus(KarteGelegt);
        ButtonChose1.Enabled := false;
        ButtonChose2.Enabled := false;
        ButtonChose3.Enabled := false;
        ButtonChose4.Enabled := false;
        ButtonChose5.Enabled := false;
     end;

end;

//Form create -> Set Connection to disonnection
procedure TFormMauMauClient.FormCreate(Sender: TObject);
begin
     IsConnected := false;
end;


end.
